/* ! Verify-v0.1.0 MIT License by 大熊 */

var flag = 0;

;
(function($, window, document, undefined) {

	// 定义Code的构造函数
	var Code = function(ele, opt) {
		this.$element = ele, this.defaults = {
			type : 1,
			figure : 100, // 位数，仅在type=2时生效
			arith : 0, // 算法，支持加减乘，0为随机，仅在type=2时生效
			width : '200px',
			height : '60px',
			fontSize : '30px',
			codeLength : 6,
			btnId : 'check-btn',
			ready : function() {
			},
			success : function() {
			},
			error : function() {
			}
		}, this.options = $.extend({}, this.defaults, opt)
	};

	var _code_chars = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'a', 'b', 'c', 'd', 'e',
			'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r',
			's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E',
			'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R',
			'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
	var _code_color1 = ['#fffff0', '#f0ffff', '#f0fff0', '#fff0f0'];
	var _code_color2 = ['#FF0033', '#006699', '#993366', '#FF9900', '#66CC66',
			'#FF33CC'];

	// 定义Code的方法
	Code.prototype = {
		init : function() {

			var _this = this;

			this.loadDom();
			this.setCode();

			this.options.ready();

			this.$element[0].onselectstart = document.body.ondrag = function() {
				return false;
			};

			// 点击验证码
			this.$element.find('.verify-code, .verify-change-code').on('click',
					function() {
						_this.setCode();
					});

			// 确定的点击事件
			this.htmlDoms.code_btn.on('click', function() {
						_this.checkCode();
					})

		},

		// 加载页面
		loadDom : function() {
			var panelHtml = '<div class="cerify-code-panel"><div class="verify-code"></div><div class="verify-code-area"><div class="verify-input-area"><input type="text" class="varify-input-code" /></div><div class="verify-change-area"><a class="verify-change-code">换一张</a></div></div></div>';
			this.$element.append(panelHtml);

			this.htmlDoms = {
				code_btn : $('#' + this.options.btnId),
				code : this.$element.find('.verify-code'),
				code_area : this.$element.find('.verify-code-area'),
				code_input : this.$element.find('.varify-input-code')
				,
			};

			this.htmlDoms.code.css({
						'width' : this.options.width,
						'height' : this.options.height,
						'line-height' : this.options.height,
						'font-size' : this.options.fontSize
					});
			this.htmlDoms.code_area.css({
						'width' : this.options.width
					});
		},

		// 设置验证码
		setCode : function() {

			var color1Num = Math.floor(Math.random() * 3);
			var color2Num = Math.floor(Math.random() * 5);

			this.htmlDoms.code.css({
						'background-color' : _code_color1[color1Num],
						'color' : _code_color2[color2Num]
					});
			this.htmlDoms.code_input.val('');

			var code = '';
			this.code_chose = '';

			if (this.options.type == 1) { // 普通验证码
				for (var i = 0; i < this.options.codeLength; i++) {
					var charNum = Math.floor(Math.random() * 52);
					var tmpStyle = (charNum % 2 == 0)
							? "font-style:italic;margin-right: 10px;"
							: "font-weight:bolder;";
					tmpStyle += (Math.floor(Math.random() * 2) == 1)
							? "font-weight:bolder;"
							: "";

					this.code_chose += _code_chars[charNum];
					code += '<font style="' + tmpStyle + '">'
							+ _code_chars[charNum] + '</font>';
				}
			} else { // 算法验证码

				var num1 = Math.floor(Math.random() * this.options.figure);
				var num2 = Math.floor(Math.random() * this.options.figure);

				if (this.options.arith == 0) {
					var tmparith = Math.floor(Math.random() * 3);
				}

				switch (tmparith) {
					case 1 :
						this.code_chose = parseInt(num1) + parseInt(num2);
						code = num1 + ' + ' + num2 + ' = ?';
						break;
					case 2 :
						if (parseInt(num1) < parseInt(num2)) {
							var tmpnum = num1;
							num1 = num2;
							num2 = tmpnum;
						}
						this.code_chose = parseInt(num1) - parseInt(num2);
						code = num1 + ' - ' + num2 + ' = ?';
						break;
					default :
						this.code_chose = parseInt(num1) * parseInt(num2);
						code = num1 + ' × ' + num2 + ' = ?';
						break;
				}
			}

			this.htmlDoms.code.html(code);

		},

		// 比对验证码
		checkCode : function() {
			if (this.options.type == 1) { // 普通验证码
				var own_input = this.htmlDoms.code_input.val().toUpperCase();
				this.code_chose = this.code_chose.toUpperCase();
			} else {
				var own_input = this.htmlDoms.code_input.val();
			}

			if (own_input == this.code_chose) {
				this.options.success();
			} else {
				this.options.error();
				this.setCode();
			}
		}
	};

	// 定义Slide的构造函数
	var Slide = function(ele, opt) {
		this.$element = ele, this.defaults = {

			type : 1,
			vOffset : 5,
			vSpace : 5,
			imgName : ['1.jpg', '2.jpg'],
			imgSize : {
				width : '400px',
				height : '200px'
				,
			},
			blockSize : {
				width : '50px',
				height : '50px'
				,
			},
			barSize : {
				width : '400px',
				height : '40px'
				,
			},
			ready : function() {
			},
			success : function() {
			},
			error : function() {
			}

		}, this.options = $.extend({}, this.defaults, opt)
	};

	// 定义Slide的方法
	Slide.prototype = {

		init : function() {
			var _this = this;

			// 加载页面
			this.loadDom();
			this.options.ready();

			this.$element[0].onselectstart = document.body.ondrag = function() {
				return false;
			};

			// 按下
			this.htmlDoms.move_block.on('touchstart', function(e) {
						_this.start(e);
					});

			this.htmlDoms.move_block.on('mousedown', function(e) {
						_this.start(e);
					});

			// 拖动
			window.addEventListener("touchmove", function(e) {
						_this.move(e);
					});
			window.addEventListener("mousemove", function(e) {
						_this.move(e);
					});

			// 鼠标松开
			window.addEventListener("touchend", function() {
						_this.end();
					});
			window.addEventListener("mouseup", function() {
						_this.end();
					});

			// 刷新
			_this.$element.find('.verify-refresh').on('click', function() {
						_this.refresh();
					});
		},

		// 初始化加载
		loadDom : function() {
			this.img_rand = Math.floor(Math.random()
					* this.options.imgName.length); // 随机的背景图片

			var panelHtml = '';
			var tmpHtml = '';

			if (this.options.type != 1) { // 图片滑动
				panelHtml += '<div class="verify-img-panel"><div  class="verify-refresh"><i class="iconfont icon-refresh"></i></div><div class="verify-gap" style="opacity:0.5;"></div></div>';
				tmpHtml = '<div  class="verify-sub-block" ></div>';
			}

			panelHtml += '<div class="verify-bar-area"><span  class="verify-msg">向右滑动完成验证</span><div class="verify-left-bar"><span  class="verify-msg"></span><div  class="verify-move-block"><i  class="verify-icon iconfont icon-right"></i>'
					+ tmpHtml + '</div></div></div>';
			this.$element.append(panelHtml);

			this.htmlDoms = {
				gap : this.$element.find('.verify-gap'),
				sub_block : this.$element.find('.verify-sub-block'),
				img_panel : this.$element.find('.verify-img-panel'),
				bar_area : this.$element.find('.verify-bar-area'),
				move_block : this.$element.find('.verify-move-block'),
				left_bar : this.$element.find('.verify-left-bar'),
				msg : this.$element.find('.verify-msg'),
				icon : this.$element.find('.verify-icon'),
				refresh : this.$element.find('.verify-refresh')
			};

			this.status = false; // 鼠标状态
			this.setSize = this.resetSize(this); // 重新设置宽度高度

			this.htmlDoms.gap.css({
						'width' : this.options.blockSize.width,
						'height' : this.options.blockSize.height
					});
			this.htmlDoms.sub_block.css({
						'width' : this.options.blockSize.width,
						'height' : this.options.blockSize.height
					});
			this.htmlDoms.img_panel.css({
						'width' : this.setSize.img_width,
						'height' : this.setSize.img_height,
						'background' : 'url(images/'
								+ this.options.imgName[this.img_rand] + ')',
						'background-size' : this.setSize.img_width + ' '
								+ this.setSize.img_height
					});
			this.htmlDoms.bar_area.css({
						'width' : this.setSize.bar_width,
						'height' : this.options.barSize.height,
						'line-height' : this.options.barSize.height
					});
			this.htmlDoms.move_block.css({
						'width' : this.options.barSize.height,
						'height' : this.options.barSize.height
					});
			this.htmlDoms.left_bar.css({
						'width' : this.options.barSize.height,
						'height' : this.options.barSize.height
					});

			this.randSet();
		},

		// 鼠标按下
		start : function(e) {
			this.htmlDoms.msg.text('');
			this.htmlDoms.move_block.css('background-color', '#337ab7');
			this.htmlDoms.left_bar.css('border-color', '#337AB7');
			this.htmlDoms.icon.css('color', '#fff');
			e.stopPropagation();
			this.status = true;

		},

		// 鼠标移动
		move : function(e) {
			if (this.status) {
				if (!e.touches) { // 兼容移动端
					var x = e.clientX;
				} else { // 兼容PC端
					var x = e.touches[0].pageX;
				}
				var bar_area_left = Slide.prototype
						.getLeft(this.htmlDoms.bar_area[0]);
				var move_block_left = x - bar_area_left; // 小方块相对于父元素的left值

				if (this.options.type != 1) { // 图片滑动
					if (move_block_left >= this.htmlDoms.bar_area[0].offsetWidth
							- parseInt(parseInt(this.options.blockSize.width)
									/ 2) - 2) {
						move_block_left = this.htmlDoms.bar_area[0].offsetWidth
								- parseInt(parseInt(this.options.blockSize.width)
										/ 2) - 2;
					}

				} else { // 普通滑动
					if (move_block_left >= this.htmlDoms.bar_area[0].offsetWidth
							- parseInt(parseInt(this.options.barSize.height)
									/ 2) + 3) {
						this.$element.find('.verify-msg:eq(1)').text('');
						move_block_left = this.htmlDoms.bar_area[0].offsetWidth
								- parseInt(parseInt(this.options.barSize.height)
										/ 2) + 3;
					} else {
						this.$element.find('.verify-msg:eq(1)').text('');
					}
				}

				if (move_block_left <= 0) {
					move_block_left = parseInt(parseInt(this.options.blockSize.width)
							/ 2);
				}

				// 拖动后小方块的left值 *
				this.htmlDoms.move_block
						.css(
								'left',
								move_block_left
										- parseInt(parseInt(this.options.blockSize.width)
												/ 2 - 3) + "px");
				this.htmlDoms.left_bar
						.css(
								'width',
								move_block_left
										- parseInt(parseInt(this.options.blockSize.width)
												/ 2 - 3) + "px");
			}
		},

		// 鼠标松开
		end : function() {

			var _this = this;

			// 判断是否重合
			if (this.status) {

				if (this.options.type != 1) { // 图片滑动

					var vOffset = parseInt(this.options.vOffset);
					if (parseInt(this.htmlDoms.gap.css('left')) >= (parseInt(this.htmlDoms.move_block
							.css('left')) - vOffset)
							&& parseInt(this.htmlDoms.gap.css('left')) <= (parseInt(this.htmlDoms.move_block
									.css('left')) + vOffset)) {
						this.htmlDoms.move_block.css('background-color',
								'#5cb85c');
						this.htmlDoms.left_bar.css({
									'border-color' : '#5cb85c',
									'background-color' : '#fff'
								});
						this.htmlDoms.icon.css('color', '#fff');
						this.htmlDoms.icon.removeClass('icon-right');
						this.htmlDoms.icon.addClass('icon-check');
						this.htmlDoms.refresh.hide();
						this.htmlDoms.move_block.unbind('mousedown touchstart');
						this.options.success();
					} else {
						this.htmlDoms.move_block.css('background-color',
								'#d9534f');
						this.htmlDoms.left_bar.css('border-color', '#d9534f');
						this.htmlDoms.icon.css('color', '#fff');
						this.htmlDoms.icon.removeClass('icon-right');
						this.htmlDoms.icon.addClass('icon-close');

						setTimeout(function() {
									_this.htmlDoms.move_block.animate({
												'left' : '0px'
											}, 'fast');
									_this.htmlDoms.left_bar.animate({
												'width' : '40px'
											}, 'fast');
									_this.htmlDoms.left_bar.css({
												'border-color' : '#ddd'
											});

									_this.htmlDoms.move_block.css(
											'background-color', '#fff');
									_this.htmlDoms.icon.css('color', '#000');
									_this.htmlDoms.icon
											.removeClass('icon-close');
									_this.htmlDoms.icon.addClass('icon-right');
									_this.$element.find('.verify-msg:eq(0)')
											.text('向右滑动完成验证');

								}, 400);

						this.options.error();
					}

				} else { // 普通滑动

					if (parseInt(this.htmlDoms.move_block.css('left')) >= (parseInt(this.setSize.bar_width)
							- parseInt(this.options.barSize.height) - parseInt(this.options.vOffset))) {
						this.htmlDoms.move_block.css('background-color',
								'#5cb85c');
						this.htmlDoms.left_bar.css({
									'color' : '#4cae4c',
									'border-color' : '#5cb85c',
									'background-color' : '#fff'
								});
						this.htmlDoms.icon.css('color', '#fff');
						this.htmlDoms.icon.removeClass('icon-right');
						this.htmlDoms.icon.addClass('icon-check');
						this.htmlDoms.refresh.hide();
						this.htmlDoms.move_block.unbind('mousedown');
						this.htmlDoms.move_block.unbind('touchstart');
						this.$element.find('.verify-msg:eq(1)').text('验证成功');
						this.options.success();
					} else {
						// 未完成
						this.htmlDoms.move_block.css('background-color',
								'#d9534f');
						this.htmlDoms.left_bar.css('border-color', '#d9534f');
						this.htmlDoms.icon.css('color', '#fff');
						this.htmlDoms.icon.removeClass('icon-right');
						this.htmlDoms.icon.addClass('icon-close');

						setTimeout(function() {
									_this.htmlDoms.move_block.animate({
												'left' : '0px'
											}, 'fast');
									_this.htmlDoms.left_bar.animate({
												'width' : '35px'
											}, 'fast');
									_this.htmlDoms.left_bar.css({
												'border-color' : '#ddd'
											});

									_this.htmlDoms.move_block.css(
											'background-color', '#fff');
									_this.htmlDoms.icon.css('color', '#000');
									_this.htmlDoms.icon
											.removeClass('icon-close');
									_this.htmlDoms.icon.addClass('icon-right');
									_this.$element.find('.verify-msg:eq(0)')
											.text('向右滑动解锁');

								}, 400);

						this.options.error();
					}
				}

				this.status = false;
			}
		},

		resetSize : function(obj) {
			var img_width, img_height, bar_width, bar_height; // 图片的宽度、高度，移动条的宽度、高度
			var parentWidth = obj.$element.parent().width()
					|| $(window).width();
			var parentHeight = obj.$element.parent().height()
					|| $(window).height();

			if (obj.options.imgSize.width.indexOf('%') != -1) {
				img_width = parseInt(obj.options.imgSize.width) / 100
						* parentWidth + 'px';
			} else {
				img_width = obj.options.imgSize.width;
			}

			if (obj.options.imgSize.height.indexOf('%') != -1) {
				img_height = parseInt(obj.options.imgSize.height) / 100
						* parentHeight + 'px';
			} else {
				img_height = obj.options.imgSize.height;
			}

			if (obj.options.barSize.width.indexOf('%') != -1) {
				bar_width = parseInt(obj.options.barSize.width) / 100
						* parentWidth + 'px';
			} else {
				bar_width = obj.options.barSize.width;
			}

			if (obj.options.barSize.height.indexOf('%') != -1) {
				bar_height = parseInt(obj.options.barSize.height) / 100
						* parentHeight + 'px';
			} else {
				bar_height = obj.options.barSize.height;
			}

			return {
				img_width : img_width,
				img_height : img_height,
				bar_width : bar_width,
				bar_height : bar_height
			};
		},

		// 随机出生点位
		randSet : function() {
			var rand1 = Math.floor(Math.random() * 9 + 1);
			var rand2 = Math.floor(Math.random() * 9 + 1);
			var top = rand1 * parseInt(this.setSize.img_height) / 15
					+ parseInt(this.setSize.img_height) * 0.1;
			var left = rand2 * parseInt(this.setSize.img_width) / 15
					+ parseInt(this.setSize.img_width) * 0.1;

			this.$element.find('.verify-img-panel').css('margin-bottom',
					this.options.vSpace + 'px');
			this.$element.find('.verify-gap').css({
						'top' : top,
						'left' : left
					});
			this.$element.find('.verify-sub-block').css({
				'top' : '-'
						+ (parseInt(this.setSize.img_height) - top
								+ this.options.vSpace + 2) + 'px',
				'background-image' : 'url(images/'
						+ this.options.imgName[this.img_rand] + ')',
				'background-size' : this.setSize.img_width + ' '
						+ this.setSize.img_height,
				'background-position-y' : '-' + top + 'px',
				'background-position-x' : '-' + left + 'px'
			});
		},

		// 刷新
		refresh : function() {
			this.randSet();
			this.img_rand = Math.floor(Math.random()
					* this.options.imgName.length); // 随机的背景图片
			this.$element.find('.verify-img-panel').css({
				'background' : 'url(images/'
						+ this.options.imgName[this.img_rand] + ')',
				'background-size' : this.setSize.img_width + ' '
						+ this.setSize.img_height
			});
			this.$element.find('.verify-sub-block').css({
				'background-image' : 'url(images/'
						+ this.options.imgName[this.img_rand] + ')',
				'background-size' : this.setSize.img_width + ' '
						+ this.setSize.img_height
			});
		},

		// 获取left值
		getLeft : function(node) {
			var left = $(node).offset().left;
			// var nowPos = node.offsetParent;
			//          
			// while(nowPos != null) {
			// left += $(nowPos).offset().left;
			// nowPos = nowPos.offsetParent;
			// }
			return left;
		}
	};

	// 定义Points的构造函数
	var Points = function(ele, opt) {
		this.$element = ele, this.defaults = {
			defaultNum : 4, // 默认的文字数量
			checkNum : 3, // 校对的文字数量
			vSpace : 5, // 间隔
			imgName : ['1.jpg', '2.jpg'],
			imgSize : {
				width : '400px',
				height : '200px'
				,
			},
			barSize : {
				width : '400px',
				height : '40px'
				,
			},
			ready : function() {
			},
			success : function() {
			},
			error : function() {
			}
		}, this.options = $.extend({}, this.defaults, opt)
	};

	// 定义Points的方法
	Points.prototype = {
		init : function() {

			var _this = this;

			// 加载页面
			_this.loadDom();

			_this.refresh();
			_this.options.ready();

			this.$element[0].onselectstart = document.body.ondrag = function() {
				return false;
			};

			// 点击事件比对
			_this.$element.find('.verify-img-panel canvas').on('click',
					function(e) {

						_this.checkPosArr.push(_this.getMousePos(this, e));

						if (_this.num == _this.options.checkNum) {

							_this.num = _this.createPoint(_this.getMousePos(
									this, e));
							setTimeout(function() {
								var flag = _this.comparePos(_this.fontPos,
										_this.checkPosArr);

								if (flag == false) { // 验证失败

									_this.options.error();
									_this.$element.find('.verify-bar-area')
											.css({
														'color' : '#d9534f',
														'border-color' : '#d9534f'
													});
									_this.$element.find('.verify-msg')
											.text('验证失败');

									setTimeout(function() {
										_this.$element.find('.verify-bar-area')
												.css({
															'color' : '#000',
															'border-color' : '#ddd'
														});
										_this.refresh();
									}, 400);

								} else { // 验证成功
									_this.$element.find('.verify-bar-area')
											.css({
														'color' : '#4cae4c',
														'border-color' : '#5cb85c'
													});
									_this.$element.find('.verify-msg')
											.text('验证成功');
									_this.$element.find('.verify-refresh')
											.hide();
									_this.$element.find('.verify-img-panel')
											.unbind('click');
									_this.options.success();
								}
							}, 400);

						}

						if (_this.num < _this.options.checkNum) {
							_this.num = _this.createPoint(_this.getMousePos(
									this, e));
						}

					});

			// 刷新
			_this.$element.find('.verify-refresh').on('click', function() {
						_this.refresh();
					});

		},

		// 加载页面
		loadDom : function() {

			this.fontPos = []; // 选中的坐标信息
			this.checkPosArr = []; // 用户点击的坐标
			this.num = 1; // 点击的记数
			this.img_rand = Math.floor(Math.random()
					* this.options.imgName.length); // 随机的背景图片

			var panelHtml = '';
			var tmpHtml = '';

			this.setSize = Slide.prototype.resetSize(this); // 重新设置宽度高度

			panelHtml += '<div class="verify-img-panel"><div  class="verify-refresh" style="z-index:9999"><i class="iconfont icon-refresh"></i></div><canvas width="'
					+ this.setSize.img_width
					+ '" height="'
					+ this.setSize.img_height
					+ '"></canvas></div><div class="verify-bar-area"><span  class="verify-msg"></span></div>';

			this.$element.append(panelHtml);

			this.htmlDoms = {
				img_panel : this.$element.find('.verify-img-panel'),
				bar_area : this.$element.find('.verify-bar-area'),
				msg : this.$element.find('.verify-msg')
				,
			};

			this.htmlDoms.img_panel.css({
						'width' : this.setSize.img_width,
						'height' : this.setSize.img_height,
						'background-size' : this.setSize.img_width + ' '
								+ this.setSize.img_height,
						'margin-bottom' : this.options.vSpace + 'px'
					});
			this.htmlDoms.bar_area.css({
						'width' : this.options.barSize.width,
						'height' : this.options.barSize.height,
						'line-height' : this.options.barSize.height
					});

		},

		// 绘制合成的图片
		drawImg : function(obj, img) {
			// 准备canvas环境
			var canvas = this.$element.find('canvas')[0];
			// var canvas=document.getElementById("myCanvas");
			var ctx = canvas.getContext("2d");

			// 绘制图片
			ctx.drawImage(img, 0, 0, parseInt(this.setSize.img_width),
					parseInt(this.setSize.img_height));

			// 绘制水印
			var fontSizeArr = ['italic small-caps bold 20px microsoft yahei',
					'small-caps normal 25px arial', '34px microsoft yahei'];
			var fontStr = '天地玄黄宇宙洪荒日月盈昃辰宿列张寒来暑往秋收冬藏闰余成岁律吕调阳云腾致雨露结为霜金生丽水玉出昆冈剑号巨阙珠称夜光果珍李柰菜重芥姜海咸河淡鳞潜羽翔龙师火帝鸟官人皇始制文字乃服衣裳推位让国有虞陶唐吊民伐罪周发殷汤坐朝问道垂拱平章爱育黎首臣伏戎羌遐迩体率宾归王'; // 不重复的汉字

			var fontChars = [];

			var avg = Math.floor(parseInt(this.setSize.img_width)
					/ (parseInt(this.options.defaultNum) + 1));
			var tmp_index = '';
			var color2Num = Math.floor(Math.random() * 5);

			for (var i = 1; i <= this.options.defaultNum; i++) {

				fontChars[i - 1] = this.getChars(fontStr, fontChars);

				tmp_index = Math.floor(Math.random() * 3);
				ctx.font = fontSizeArr[tmp_index];
				ctx.fillStyle = _code_color2[color2Num];

				if (Math.floor(Math.random() * 2) == 1) {
					var tmp_y = Math.floor(parseInt(this.setSize.img_height)
							/ 2)
							+ tmp_index * 20 + 20;
				} else {
					var tmp_y = Math.floor(parseInt(this.setSize.img_height)
							/ 2)
							- tmp_index * 20;
				}

				ctx.fillText(fontChars[i - 1], avg * i, tmp_y);
				this.fontPos[i - 1] = {
					'char' : fontChars[i - 1],
					'x' : avg * i,
					'y' : tmp_y
				};

			}

			for (var i = 0; i < (this.options.defaultNum - this.options.checkNum); i++) {
				this.shuffle(this.fontPos).pop();
			}

			var msgStr = '';
			for (var i = 0; i < this.fontPos.length; i++) {
				msgStr += this.fontPos[i].char + ',';
			}

			this.htmlDoms.msg.text('请顺序点击【'
					+ msgStr.substring(0, msgStr.length - 1) + '】');

			return this.fontPos;
		},

		// 获取坐标
		getMousePos : function(obj, event) {
			var e = event || window.event;
			var scrollX = document.documentElement.scrollLeft
					|| document.body.scrollLeft;
			var scrollY = document.documentElement.scrollTop
					|| document.body.scrollTop;
			var x = e.clientX - ($(obj).offset().left - $(window).scrollLeft());
			var y = e.clientY - ($(obj).offset().top - $(window).scrollTop());

			return {
				'x' : x,
				'y' : y
			};
		},

		// 递归去重
		getChars : function(fontStr, fontChars) {

			var tmp_rand = parseInt(Math.floor(Math.random() * fontStr.length));
			if (tmp_rand > 0) {
				tmp_rand = tmp_rand - 1;
			}

			tmp_char = fontStr.charAt(tmp_rand);
			if ($.inArray(tmp_char, fontChars) == -1) {
				return tmp_char;
			} else {
				return Points.prototype.getChars(fontStr, fontChars);
			}
		},

		// 洗牌数组
		/*
		 * shuffle : function(arr) { var m = arr.length, i; while (m) { i =
		 * (Math.random() * m--) >>> 0; [arr[m], arr[i]] = [arr[i], arr[m]] }
		 * return arr; },
		 */

		// 创建坐标点
		createPoint : function(pos) {
			this.htmlDoms.img_panel
					.append('<div class="point-area" style="background-color:#1abd6c;color:#fff;z-index:9999;width:30px;height:30px;text-align:center;line-height:30px;border-radius: 50%;position:absolute;top:'
							+ parseInt(pos.y - 10)
							+ 'px;left:'
							+ parseInt(pos.x - 10)
							+ 'px;">'
							+ this.num
							+ '</div>');
			return ++this.num;
		},

		// 比对坐标点
		comparePos : function(fontPos, checkPosArr) {

			var flag = true;
			for (var i = 0; i < fontPos.length; i++) {
				if (!(parseInt(checkPosArr[i].x) + 40 > fontPos[i].x
						&& parseInt(checkPosArr[i].x) - 40 < fontPos[i].x
						&& parseInt(checkPosArr[i].y) + 40 > fontPos[i].y && parseInt(checkPosArr[i].y)
						- 40 < fontPos[i].y)) {
					flag = false;
					break;
				}
			}

			return flag;
		},

		// 刷新
		refresh : function() {
			var _this = this;
			this.$element.find('.point-area').remove();
			this.fontPos = [];
			this.checkPosArr = [];
			this.num = 1;

			this.img_rand = Math.floor(Math.random()
					* this.options.imgName.length); // 随机的背景图片
			var img = new Image();
			img.src = 'images/' + this.options.imgName[this.img_rand];

			// 加载完成开始绘制
			$(img).on('load', function(e) {
						this.fontPos = _this.drawImg(_this, this);
					});

		}
		,

	};

	// 在插件中使用codeVerify对象
	$.fn.codeVerify = function(options, callbacks) {
		var code = new Code(this, options);
		code.init();
	};

	// 在插件中使用slideVerify对象
	$.fn.slideVerify = function(options, callbacks) {
		var slide = new Slide(this, options);
		slide.init();
	};

	// 在插件中使用clickVerify对象
	$.fn.pointsVerify = function(options, callbacks) {
		var points = new Points(this, options);
		points.init();
	};

})(jQuery, window, document);
